// Person 类
class Person {
  // name 和 age 是受保护属性, 不能在类外部访问, 但可以在【类】与【子类】中访问
  constructor(
    protected name: string,
    protected age: number
  ) { }

  // getDetails 是受保护方法, 不能在类外部访问, 但可以在【类】与【子类】中访问
  protected getDetails(): string {
    // 类中能访问受保护的 name 和 age 属性
    return `我叫: ${this.name}, 年龄是: ${this.age}`
  }

  // introduce 是公开方法, 类、子类、类外部都能使用
  introduce() {
    // 类中能访问受保护的 getDetails 方法
    console.log(this.getDetails())
  }
}

const p1 = new Person('杨超越', 18)
// 可以在类外部访问 introduce
// p1.introduce()

// 类的外部: 以下代码均报错
// p1.getDetails()
// p1.name
// p1.age

// Student 继承 Person
class Student extends Person {
  study() {
    // 子类中可以访问 getDetails
    console.log(this.getDetails())
    // 子类中可以访问 introduce
    this.introduce()
    // 子类中可以访问 name
    console.log(`${this.name}正在努力学习`)
  }
}

const s1 = new Student('tom', 17)
s1.study()